home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / coding / dsp / c30ug.exe / $MAT.ASM < prev    next >
Assembly Source File  |  1988-03-26  |  2KB  |  86 lines

  1. ;**************************************************************
  2. ;  
  3. ;                 $mat.asm
  4. ;  
  5. ;                 staff
  6. ;  
  7. ;                 03-26-88
  8. ;  
  9. ;           (C) Texas Instruments Inc., 1992 
  10. ;  
  11. ;           Refer to the file 'license.txt' included with this 
  12. ;           this package for usage and license information. 
  13. ;  
  14. ;**************************************************************
  15. Example 34.  Matrix times a vector multiplication
  16. ;
  17. ;==============================================================================
  18. ;                            SUBROUTINE  M A T
  19. ;==============================================================================
  20. ; MAT == MATRIX TIMES A VECTOR OPERATION
  21. ;
  22. ;
  23. ; TYPICAL CALLING SEQUENCE:
  24. ;
  25. ;       load    AR0
  26. ;       load    AR1
  27. ;       load    AR2
  28. ;       load    AR3
  29. ;       load    R1
  30. ;       CALL    MAT
  31. ;
  32. ;
  33. ; ARGUMENT ASSIGNMENTS:
  34. ;   argument | function
  35. ;   ---------+-----------------------
  36. ;   AR0      | address of m(0,0)
  37. ;   AR1      | address of v(0)
  38. ;   AR2      | address of p(0)
  39. ;   AR3      | number of rows - 1 (numrows-1)
  40. ;   R1       | number of columns - 2 (numcols-2)
  41. ;
  42. ; REGISTERS USED AS INPUT: AR0, AR1, AR2, AR3, R1
  43. ; REGISTERS MODIFIED: R0, R2, AR0, AR1, AR2, AR3, IR0,
  44. ;   RC, RSA, REA
  45. ;
  46. ;
  47. ; PROGRAM SIZE: 11
  48. ;
  49. ; EXECUTION CYCLES: 6 + 10 * numrows + numrows * (numcols - 1)
  50. ;
  51. ;==============================================================================
  52. ;
  53.     .global    MAT
  54. ;
  55. ; setup
  56. ;
  57. MAT     LDI     R1,IR0                  ; number of columns-2 -> IR0
  58.     ADDI    2,IR0            ; IR0 = numcols 
  59. ;
  60. ; for (i = 0; i < numrows; i++) loop over the rows.
  61. ;
  62. ROWS    LDF     0.0,R2                  ; initialize R2
  63.         MPYF3   *AR0++(1),*AR1++(1),R0  ; m(i,0) * v(0) -> R0
  64. ;
  65. ;   for (j = 1; j < numcols; j++) do dot product over columns
  66. ;
  67.         RPTS    R1                      ; multiply a row by a column.
  68. ;
  69.         MPYF3   *AR0++(1),*AR1++(1),R0  ; m(i,j) * v(j) -> R0.
  70. ||      ADDF3   R0,R2,R2                ; m(i,j-1) * v(j-1) + R2 -> R2.
  71. ;
  72.         DBD     AR3,ROWS                ; counts the number of rows left.
  73. ;
  74.         ADDF    R0,R2                   ; last accumulate.
  75.         STF     R2,*AR2++(1)            ; result -> p(i)
  76.         NOP     *--AR1(IR0)             ; set AR1 to point to v(0).
  77. ; !!!   delayed branch happens here !!!
  78. ;
  79. ; return sequence
  80. ;
  81.         RETS                            ; return
  82. ;
  83. ; end
  84. ;
  85.     .end
  86.